/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.entidades.Actividad;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import sv.com.compassion.entidades.Asistencia;
import sv.com.compassion.entidades.Beneficiario;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Se define la interacción del mantenimiento Asistencia (Se utiliza para ingresar asistencia,
 * eliminar y modificar asistencia)
 * @author geovany
*/
public class Asistencia3Action extends ComunAction {
    private GenericoDAO genericoDAO;
    private Actividad actividad;
    private String idAct;
    private String dia;
    private String mes;
    private String annio;
    private String fecSel;
    
    private String modo;
    
    private String idAss;
    private String idRanEdad;
    
    private String idActAdd;
    private String fecPro;
    
    private String modoSea;

 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad Asistencia. 
 */ 
public Asistencia3Action(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
} 

/**
 * Busca el método que se ejecutara
 */
    @Override
    public String execute(){
        buscarMetodo(actividad);        
        return null;
    }
 /**
 * @param objeto de la entidad Asistencia
 * Inserta una nueva asistencia a la entidad Asistencia
 */       
    @Override    
    public void agregarEntidad(Object o) {

        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        
        idAss = getRequest().getParameter("IdBen");
        idAct = getRequest().getParameter("IdAct");
        fecPro = getRequest().getParameter("FecAss");
        
        DateFormat dfm = new SimpleDateFormat("yyyy-MM-dd");

        String idBeneficiario = "";
        String asist = "";
        int ind = 0;
        
        try{
           Date    date    =   new Date();
            
           Calendar cal = Calendar.getInstance();
           date=cal.getTime();
            
           while(idAss.length() > 0){
                
                ind = idAss.indexOf(",");
                idBeneficiario = idAss.substring(0,ind);
                idAss = idAss.substring(ind+1,idAss.length());
                ind = idAss.indexOf(",");
                asist = idAss.substring(0,ind);
                idAss = idAss.substring(ind+1,idAss.length());

                Asistencia xAdd = new Asistencia();
                
                Beneficiario b1 = new Beneficiario();
                b1.setIdBeneficiario(Integer.parseInt(idBeneficiario));
                xAdd.setIdBeneficiario(b1);
                
                Actividad a1 = new Actividad();
                a1.setIdActividad(Integer.parseInt(idAct));
                xAdd.setIdActividad(a1); 
                
                xAdd.setFecAsistencia(dfm.parse(fecPro));
                
                xAdd.setAuAddUsr(Integer.parseInt(idUsuario));
                xAdd.setAuAddDat(date);
                if(asist.equals("1")){
                   xAdd.setAsistio(true);
                }else{
                   xAdd.setAsistio(false);
                }
                    
                genericoDAO.save(xAdd);
            }
       }catch(Exception e){
            Logger.getLogger(Asistencia3Action.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
        
    }
 /**
 * @param objeto de la entidad Asistencia
 * Se conoce si para una actividad especifica y una fecha existe una asistencia
 */    
    @Override
    public void borrarEntidad(Object o) {
           int total = 0;
           String query="";
           
           idActAdd = getRequest().getParameter("IdActAdd");
           fecPro = getRequest().getParameter("FecPro");

           query = "SELECT count(x) FROM Asistencia x WHERE " +
                    "x.idActividad = '" + idActAdd + "' and " +
                    "x.fecAsistencia = '" + fecPro + "' ";
           total = genericoDAO.countRow(query);
           JSONObject obj = new JSONObject();  
           if(total == 0){
                    obj.element("agreg",1);
           }else{
                    obj.element("agreg",0);
           }   
           JSONObject jo = JSONObject.fromObject(obj);
           enviarJsonNavegador(getResponse(), jo);
    }
 /**
 * @param objeto de la entidad Asistencia
 * Se modifica una asistencia para una fecha.
 */      
    @Override
    public void editarEntidad(Object o) {
        int i = 0;
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        idAss = getRequest().getParameter("IdAss");
        
        Asistencia x;
        List<Asistencia> listaAsistencia = null;
        
        String idAsistencia = "";
        String asist = "";
        int ind = 0;
        
        try{
            Date    date    =   new Date();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();
            
           while(idAss.length() > 0){
                
                ind = idAss.indexOf(",");
                idAsistencia = idAss.substring(0,ind);
                idAss = idAss.substring(ind+1,idAss.length());
                ind = idAss.indexOf(",");
                asist = idAss.substring(0,ind);
                idAss = idAss.substring(ind+1,idAss.length());

                listaAsistencia = genericoDAO.find("SELECT x FROM Asistencia x WHERE x.idAsistencia = " + idAsistencia,null,null);
                if(!listaAsistencia.isEmpty()){

                    x = listaAsistencia.get(0);
                    x.setAuModUsr(Integer.parseInt(idUsuario));
                    x.setAuModDat(date);
                    if(asist.equals("1")){
                        x.setAsistio(true);
                    }else{
                        x.setAsistio(false);
                    }
                    
                    genericoDAO.update(x);
                }
           }
       }catch(Exception e){
            Logger.getLogger(Asistencia3Action.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
  /**
 * Buscar y llenar el grid del mantenimiento Asistencia y porcentajes de está,
 * esperando los valores de los filtros:
 *       idAct : ID Actividad  <br>
 *       modo : Diario o mensual <br>
 *       idRanEdad : rango de edad
 */       
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
        
        List<Asistencia> listaAsistencia = null;
        String query="";
        
        idAct = getRequest().getParameter("IdAct");
        modo = getRequest().getParameter("Modo");
        idRanEdad = getRequest().getParameter("IdRanEdad");
        
        if(modo.equals("agregar")){ 
            List<Beneficiario> listaBeneficiario = null;
            String queryAux = "";
            if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
                queryAux = "b.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "') and ";
            }
             try{
                if(getSearch()!= null && getSearch().equals("true")){
                }else{
                    query = "SELECT b FROM Beneficiario b WHERE " +
                                queryAux + 
                                "b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEdad + "') and b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEdad + "') " + 
                                "and b.estBeneficiario = 1 " + 
                                "ORDER BY b.nomBeneficiario " + getSord();
                }

                listaBeneficiario = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                query = "SELECT COUNT(b) FROM Beneficiario b WHERE " +
                                queryAux + 
                                "b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEdad + "') and b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEdad + "') " + 
                                "and b.estBeneficiario = 1 ";
                total = genericoDAO.countRow(query);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                List<RowsGrid> rows = new ArrayList<RowsGrid>();

                for(Beneficiario b: listaBeneficiario){
                    
                    RowsGrid r = new RowsGrid(); 
                    r.setId(b.getIdBeneficiario().toString());
                    List cell = new ArrayList();
                    
                    cell.add(b.getCodBeneficiario());
                    
                    cell.add(b.getEdaBeneficiario());
                    
                    if(b.getSexBeneficiario().equals("M")){
                        cell.add("Masculino");
                    }else{
                        cell.add("Femenino");
                    }
                    
                    cell.add(b.getIdNivEscolaridad().getNomNivelEscolaridad());
 
                    cell.add("Si");
                    
                    r.setCell(cell);
                    rows.add(r);                    
                }
                
                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
        }catch(Exception e){
            Logger.getLogger(Asistencia3Action.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
            
        }else{
          modoSea = getRequest().getParameter("ModoSea");
          if(modoSea.equals("1")){
            idAct = getRequest().getParameter("IdAct");
            dia = getRequest().getParameter("Dia");
            mes = getRequest().getParameter("Mes");
            annio = getRequest().getParameter("Annio");
            fecSel = annio + "-" + mes + "-" + dia;
            try{
                if(getSearch()!= null && getSearch().equals("true")){
                    /*query = "SELECT a FROM Actividad a  where";
                    
                    if(getNomActividad()!=null){
                        query += " upper(a.nomActividad) like upper('%"+ getNomActividad() +"%') and  ";
                    }
                    if(getDesActividad()!=null){
                        query += " upper(a.desActividad) like upper('%"+getDesActividad()+"%') and  ";
                    }
                    if(getFecFinalizacion()!=null){
                        query += " a.fecFinalizacion = '"+Fecha.date2String(Fecha.string2Date(getFecFinalizacion()),"yyyy-MM-dd")+"' and  ";
                    }
                    query = query.substring(0, query.length()-5)+" order by a.fecFinalizacion "+getSord();
                    listaActividad = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());*/
                }else{
                    query = "SELECT x FROM Asistencia x WHERE " +
                                "x.idActividad = '" + idAct + "' and " + 
                                "x.fecAsistencia = '" + fecSel + "' " +
                                "ORDER BY x.idBeneficiario " + getSord();
                }

                listaAsistencia = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                query = "SELECT COUNT(x) FROM Asistencia x WHERE " +
                                "x.idActividad = '" + idAct + "' and " + 
                                "x.fecAsistencia = '" + fecSel + "' ";
                total = genericoDAO.countRow(query);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                List<RowsGrid> rows = new ArrayList<RowsGrid>();
                
                float asistencia = 0;
                float totalDias = 0;
                float totalAss = 0;
                
                DecimalFormat df = new DecimalFormat("0.00"); 
                
                for(Asistencia x: listaAsistencia){
                    
                    RowsGrid r = new RowsGrid(); 
                    r.setId(x.getIdAsistencia().toString());
                    List cell = new ArrayList();
                    
                    cell.add(x.getIdBeneficiario().getCodBeneficiario());
                    
                    asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mes + "' "
                            + "and DAY(x.fecAsistencia) <= '" + dia + "' "
                            + "and x.idActividad = '" + idAct + "' "
                            + "and x.asistio = 1 "
                            + "and x.idBeneficiario = '" + x.getIdBeneficiario().getIdBeneficiario() + "'");
                    
                    totalDias = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mes + "' "
                            + "and DAY(x.fecAsistencia) <= '" + dia + "' "
                            + "and x.idActividad = '" + idAct + "' "
                            + "and x.idBeneficiario = '" + x.getIdBeneficiario().getIdBeneficiario() + "'");
                    
                    cell.add(df.format((asistencia/totalDias)*100));

                    totalAss = (asistencia/totalDias)*100;
                    
                    if(totalAss >= 80){
                            cell.add("<img src=\"img/GreenFlag.gif\">");
                        }else
                            if(totalAss >= 60 && totalAss < 80){
                               cell.add("<img src=\"img/YellowFlag.gif\">"); 
                            }
                            else
                                cell.add("<img src=\"img/RedFlag.gif\">"); 
                    
                    if(x.getAsistio()){
                        cell.add("Si");
                    }else{
                        cell.add("No");
                    }
 
                    r.setCell(cell);
                    rows.add(r);                    
                }
                
                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
        }catch(Exception e){
            Logger.getLogger(Asistencia3Action.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
       }else{
          idAct = getRequest().getParameter("IdAct");
          mes = getRequest().getParameter("Mes");
          annio = getRequest().getParameter("Annio");
          try{
                if(getSearch()!= null && getSearch().equals("true")){
                    /*query = "SELECT a FROM Actividad a  where";
                    
                    if(getNomActividad()!=null){
                        query += " upper(a.nomActividad) like upper('%"+ getNomActividad() +"%') and  ";
                    }
                    if(getDesActividad()!=null){
                        query += " upper(a.desActividad) like upper('%"+getDesActividad()+"%') and  ";
                    }
                    if(getFecFinalizacion()!=null){
                        query += " a.fecFinalizacion = '"+Fecha.date2String(Fecha.string2Date(getFecFinalizacion()),"yyyy-MM-dd")+"' and  ";
                    }
                    query = query.substring(0, query.length()-5)+" order by a.fecFinalizacion "+getSord();
                    listaActividad = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());*/
                }else{
                    query = "SELECT x FROM Asistencia x WHERE " +
                                "x.idActividad = '" + idAct + "' and " + 
                                "YEAR(x.fecAsistencia) = '" + annio + "' and " +
                                "MONTH(x.fecAsistencia) = '" + mes + "' " +
                                "GROUP BY x.idBeneficiario " +
                                "ORDER BY x.idBeneficiario " + getSord();
                }

                listaAsistencia = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                query = "SELECT COUNT(x) FROM Asistencia x WHERE " +
                                "x.idActividad = '" + idAct + "' and " + 
                                "YEAR(x.fecAsistencia) = '" + annio + "' and " +
                                "MONTH(x.fecAsistencia) = '" + mes + "' " +
                                "GROUP BY x.idBeneficiario ";
                total = genericoDAO.countRow(query);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                List<RowsGrid> rows = new ArrayList<RowsGrid>();
                
                float asistencia = 0;
                float totalDias = 0;
                float totalAss = 0;
                
                DecimalFormat df = new DecimalFormat("0.00"); 
                
                for(Asistencia x: listaAsistencia){
                    
                    RowsGrid r = new RowsGrid(); 
                    r.setId(x.getIdAsistencia().toString());
                    List cell = new ArrayList();
                    
                    cell.add(x.getIdBeneficiario().getNomBeneficiario() + " " + x.getIdBeneficiario().getApeBeneficiario());
                    
                    asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mes + "' "
                            + "and x.idActividad = '" + idAct + "' "
                            + "and x.asistio = 1 "
                            + "and x.idBeneficiario = '" + x.getIdBeneficiario().getIdBeneficiario() + "'");
                    
                    totalDias = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mes + "' "
                            + "and x.idActividad = '" + idAct + "' "
                            + "and x.idBeneficiario = '" + x.getIdBeneficiario().getIdBeneficiario() + "'");
                    
                    cell.add(df.format((asistencia/totalDias)*100));

                    totalAss = (asistencia/totalDias)*100;
                    
                    if(totalAss >= 80){
                            cell.add("<img src=\"img/GreenFlag.gif\">");
                        }else
                            if(totalAss >= 60 && totalAss < 80){
                               cell.add("<img src=\"img/YellowFlag.gif\">"); 
                            }
                            else
                                cell.add("<img src=\"img/RedFlag.gif\">"); 
                    
                    cell.add("N/A");
 
                    r.setCell(cell);
                    rows.add(r);                    
                }
                
                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
         }catch(Exception e){
            Logger.getLogger(Asistencia3Action.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
         }    
       }
      }      
    }
 public Integer getIdActividad() {
        return actividad.getIdActividad();
    }

    public void setIdActividad(Integer idActividad) {
        actividad.setIdActividad(idActividad);
    }

    public String getNomActividad() {
        return actividad.getNomActividad();
    }

    public void setNomActividad(String nomActividad) {
        actividad.setNomActividad(nomActividad);
    }

    public String getDesActividad() {
        return actividad.getDesActividad();
    }

    public void setDesActividad(String desActividad) {
        actividad.setDesActividad(desActividad);
    }

    public int getEstActividad() {
        return actividad.getEstActividad();
    }

    public void setEstActividad(int estActividad) {
        actividad.setEstActividad(estActividad);
    }

    public String getFecFinalizacion() {
        return Fecha.date2String(actividad.getFecFinalizacion());
    }

    public void setFecFinalizacion(String fecFinalizacion) {
        try {
            actividad.setFecFinalizacion(Fecha.string2Date(fecFinalizacion));
        } catch (ParseException ex) {
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAuAddUsr() {
        return actividad.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        actividad.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(actividad.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            actividad.setAuAddDat(Fecha.string2Date(auAddDat));
        } catch (ParseException ex) {
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return actividad.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        actividad.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return actividad.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        actividad.setAuModDat(auModDat);
    }

    public Integer getIdTutor() {
        return actividad.getIdTutor().getIdTutor();
    }

    public void setIdTutor(Integer idTutor) {
        actividad.getIdTutor().setIdTutor(idTutor);
    }

    public Integer getIdTipoActividad() {
        return actividad.getIdTipoActividad().getIdTipoActividad();
    }

    public void setIdTipoActividad(Integer idTipoActividad) {
        actividad.getIdTipoActividad().setIdTipoActividad(idTipoActividad);
    }

    public Integer getIdranEdad() {
        return actividad.getIdranEdad().getIdRangoEdad();
    }

    public void setIdranEdad(Integer idranEdad) {
        actividad.getIdranEdad().setIdRangoEdad(idranEdad);
    }

    public Integer getIdAula() {
        return actividad.getIdAula().getIdAula();
    }

    public void setIdAula(Integer idAula) {
        actividad.getIdAula().setIdAula(idAula);
    }
    
    @Override
    public void reporteXls() {       
    }
    
}


